"""
应用包
定义应用实例工厂函数，创建和配置应用实例
"""
import os
import logging
from flask import Flask, jsonify
from flask_cors import CORS

from app.extensions import db, migrate, jwt, ma, cors, socketio, init_extensions, cache, limiter
from app.config import config_by_name
from app.utils.errors import register_error_handlers, register_api_error_handlers
from app.utils.logging import setup_logging
from app.middlewares import register_middlewares
from app.models import User
from app.commands import register_commands

def create_app(config_name=None):
    """创建和配置应用实例
    
    Args:
        config_name: 配置名称，默认从环境变量FLASK_ENV获取
        
    Returns:
        Flask应用实例
    """
    if config_name is None:
        config_name = os.getenv('FLASK_ENV', 'development')
    
    app = Flask(__name__)
    
    # 加载配置
    app.config.from_object(config_by_name[config_name])
    app.logger.info(f'应用启动，环境: {config_name}')
    
    # 确保上传目录存在
    upload_dir = app.config.get('UPLOAD_FOLDER')
    if not os.path.exists(upload_dir):
        os.makedirs(upload_dir)
    
    # 设置日志记录
    setup_logging(app)
    
    # 初始化扩展
    init_extensions(app)
    
    # 注册中间件
    register_middlewares(app)
    
    # 注册蓝图
    register_blueprints(app)
    
    # 注册错误处理器
    register_error_handlers(app)
    register_api_error_handlers(app)
    
    # 注册命令
    register_commands(app)
    
    # 注册JWT回调
    @jwt.user_identity_loader
    def user_identity_lookup(user):
        """返回用户ID作为JWT身份"""
        return user.id if isinstance(user, User) else user
    
    @jwt.user_lookup_loader
    def user_lookup_callback(_jwt_header, jwt_data):
        """根据JWT数据查找用户"""
        identity = jwt_data["sub"]
        return User.query.filter_by(id=identity).first()
    
    # 定义健康检查路由
    @app.route('/health')
    @limiter.exempt
    def health_check():
        """健康检查路由"""
        return jsonify({
            'status': 'ok',
            'version': app.config['VERSION'],
            'environment': config_name
        })
    
    # 应用创建完成的日志记录
    app.logger.info(f"Application created with config: {config_name}")
    
    return app

def register_blueprints(app):
    """注册蓝图
    
    Args:
        app: Flask应用实例
    """
    from app.api.v1 import api_v1
    
    # 注册v1 API蓝图
    app.register_blueprint(api_v1, url_prefix='/api/v1')
    
    # 为了兼容性，也在/api前缀下注册v1 API
    app.register_blueprint(api_v1, url_prefix='/api')
    
    app.logger.info("Blueprints registered")

def init_extensions(app):
    """
    初始化Flask扩展
    
    参数:
        app: Flask应用实例
    """
    db.init_app(app)
    migrate.init_app(app, db)
    jwt.init_app(app)
    ma.init_app(app)
    socketio.init_app(app)
    cache.init_app(app)
    limiter.init_app(app)
    CORS(app, resources={r"/api/*": {"origins": app.config['CORS_ORIGINS']}})
    
    app.logger.info('扩展初始化完成')

def register_error_handlers(app):
    """
    注册错误处理器
    
    参数:
        app: Flask应用实例
    """
    @app.errorhandler(404)
    def not_found(error):
        app.logger.warning(f'404错误: {request.path}')
        return jsonify({
            'status': 'error',
            'message': '请求的资源不存在'
        }), 404
    
    @app.errorhandler(500)
    def internal_error(error):
        app.logger.error(f'500错误: {str(error)}')
        return jsonify({
            'status': 'error',
            'message': '服务器内部错误'
        }), 500
    
    app.logger.info('错误处理器注册完成') 